{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3a51f9dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import AutoTokenizer\n",
    "\n",
    "tokenizer = AutoTokenizer.from_pretrained('unsloth/Llama-3.2-3B-Instruct')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7853d213",
   "metadata": {},
   "outputs": [],
   "source": [
    "from streaming import MDSWriter\n",
    "from streaming.base.format.mds.encodings import Encoding, _encodings\n",
    "from streaming import LocalDataset\n",
    "import streaming\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "from glob import glob\n",
    "import os\n",
    "import json\n",
    "\n",
    "class UInt32(Encoding):\n",
    "    def encode(self, obj) -> bytes:\n",
    "        return obj.tobytes()\n",
    "\n",
    "    def decode(self, data: bytes):\n",
    "        return np.frombuffer(data, np.uint32)\n",
    "\n",
    "_encodings['uint32'] = UInt32\n",
    "\n",
    "columns = {\n",
    "    'input_ids': 'uint32',\n",
    "    'position_ids': 'uint32',\n",
    "    'attention_mask': 'uint32',\n",
    "}\n",
    "hashes = 'sha1', 'xxh64'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1c9d5a3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "!rm -rf tokenized-4k\n",
    "!mkdir tokenized-4k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "80fff1c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1294946"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "combine = []\n",
    "with open('combined-malaysian-sft.jsonl') as fopen:\n",
    "    for l in fopen:\n",
    "        l = json.loads(l)\n",
    "        combine.append(l)\n",
    "\n",
    "len(combine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c88624ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1364946"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "with open('translation-instructions.json') as fopen:\n",
    "    translation = json.load(fopen)\n",
    "    \n",
    "for d in translation:\n",
    "    combine.append([\n",
    "        {'role': 'user', 'content': d['input']},\n",
    "        {'role': 'assistant', 'content': d['output']}\n",
    "    ])\n",
    "    \n",
    "len(combine)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e7cfa079",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gc\n",
    "\n",
    "def collator(batch, batch_position_ids):\n",
    "    input_ids = []\n",
    "    position_ids = []\n",
    "    masks = []\n",
    "    for i in range(len(batch)):\n",
    "        l = len(batch[i])\n",
    "        input_ids.extend(batch[i])\n",
    "        position_ids.extend(batch_position_ids[i])\n",
    "        masks.append(l)\n",
    "    \n",
    "    return {\n",
    "        'input_ids': np.array(input_ids).astype(np.uint32),\n",
    "        'position_ids': np.array(position_ids).astype(np.uint32),\n",
    "        'attention_mask': np.array(masks).astype(np.uint32),\n",
    "    }\n",
    "\n",
    "def slice_and_balance(nested_list, size):\n",
    "    first = []\n",
    "    balance = []\n",
    "    current_size = 0\n",
    "\n",
    "    for sublist in nested_list:\n",
    "        if current_size < size:\n",
    "            remaining_space = size - current_size\n",
    "            if len(sublist) <= remaining_space:\n",
    "                first.append(sublist)\n",
    "                current_size += len(sublist)\n",
    "            else:\n",
    "                first.append(sublist[:remaining_space])\n",
    "                balance.append(sublist[remaining_space:])\n",
    "                current_size = size\n",
    "        else:\n",
    "            balance.append(sublist)\n",
    "    \n",
    "    return first, balance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ade760e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "def loop(files, block_size = 3072):\n",
    "    rows, index = files\n",
    "    out_root = f'tokenized-4k/tokenized-{index}'\n",
    "    os.system(f'rm -rf {out_root}')\n",
    "    count = 0\n",
    "    temp = []\n",
    "    position_ids = []\n",
    "    last_block, last_position_block = None, None\n",
    "    with MDSWriter(out=out_root, columns=columns, compression=None, hashes=hashes) as out:\n",
    "        for row in tqdm(rows):\n",
    "            prompt = tokenizer.apply_chat_template(row, tokenize=False)\n",
    "            outputs = tokenizer(prompt, add_special_tokens = False)\n",
    "            temp.append(outputs['input_ids'])\n",
    "            position_ids.append(range(len(outputs['input_ids'])))\n",
    "            count += len(outputs['input_ids'])\n",
    "            while count >= block_size:\n",
    "                block, temp = slice_and_balance(temp, block_size)\n",
    "                block_position, position_ids = slice_and_balance(position_ids, block_size)\n",
    "                count = count - block_size\n",
    "                o = collator(block, block_position)\n",
    "                last_block = block\n",
    "                last_position_block = block_position\n",
    "                out.write(o)\n",
    "                \n",
    "        block, _ = slice_and_balance(last_block, block_size - count)\n",
    "        block_position, _ = slice_and_balance(last_position_block, block_size - count)\n",
    "\n",
    "        block.extend(temp)\n",
    "        block_position.extend(position_ids)\n",
    "\n",
    "        o = collator(block, block_position)\n",
    "        if len(o['input_ids']) == block_size:\n",
    "            out.write(o)\n",
    "            return o"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3d869083",
   "metadata": {},
   "outputs": [],
   "source": [
    "# loop((combine[:10000], 0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "27c7bbe0",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [02:16<00:00, 365.05it/s]\n",
      " 64%|███████████████████████████████████████████████████████████████                                   | 32175/50000 [00:30<00:16, 1058.45it/s]\n",
      " 38%|█████████████████████████████████████▉                                                             | 19174/50000 [03:07<04:29, 114.47it/s]\n",
      " 64%|███████████████████████████████████████████████████████████████▍                                   | 32019/50000 [03:32<01:58, 152.35it/s]\n",
      " 11%|███████████▎                                                                                        | 5654/50000 [00:06<00:52, 836.82it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:44<00:00, 1125.24it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [00:50<00:00, 999.94it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [05:10<00:00, 160.90it/s]\n",
      "  6%|██████▍                                                                                              | 3194/50000 [00:25<07:58, 97.84it/s]\n",
      " 50%|██████████████████████████████████████████████████▏                                                 | 25123/50000 [05:27<10:32, 39.31it/s]\n",
      " 65%|████████████████████████████████████████████████████████████████▏                                  | 32391/50000 [02:50<02:26, 120.23it/s]\n",
      " 18%|█████████████████▊                                                                                  | 8901/50000 [01:13<05:48, 118.04it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [06:55<00:00, 120.37it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [01:35<00:00, 523.10it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [05:03<00:00, 164.70it/s]\n",
      " 49%|████████████████████████████████████████████████▎                                                  | 24396/50000 [03:19<03:49, 111.66it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [04:57<00:00, 168.17it/s]\n",
      " 77%|███████████████████████████████████████████████████████████████████████████▉                       | 38361/50000 [05:16<01:42, 113.07it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [03:54<00:00, 212.89it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [05:43<00:00, 145.46it/s]\n",
      " 35%|██████████████████████████████████▋                                                                | 17536/50000 [02:41<04:47, 112.86it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [11:14<00:00, 74.14it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [06:48<00:00, 122.33it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [06:37<00:00, 125.68it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [04:17<00:00, 194.41it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [05:06<00:00, 163.37it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [07:05<00:00, 117.53it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 50000/50000 [06:35<00:00, 126.54it/s]\n"
     ]
    }
   ],
   "source": [
    "from multiprocess import Pool\n",
    "import mp\n",
    "\n",
    "chunks = mp.chunks(combine, 50000)\n",
    "pool = Pool(10)\n",
    "pooled = pool.map(loop, chunks)\n",
    "pool.close()\n",
    "pool.join()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "74d10275",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['tokenized-4k/tokenized-0',\n",
       " 'tokenized-4k/tokenized-1',\n",
       " 'tokenized-4k/tokenized-2',\n",
       " 'tokenized-4k/tokenized-3',\n",
       " 'tokenized-4k/tokenized-4',\n",
       " 'tokenized-4k/tokenized-5',\n",
       " 'tokenized-4k/tokenized-6',\n",
       " 'tokenized-4k/tokenized-7',\n",
       " 'tokenized-4k/tokenized-8',\n",
       " 'tokenized-4k/tokenized-9',\n",
       " 'tokenized-4k/tokenized-10',\n",
       " 'tokenized-4k/tokenized-11',\n",
       " 'tokenized-4k/tokenized-12',\n",
       " 'tokenized-4k/tokenized-13',\n",
       " 'tokenized-4k/tokenized-14',\n",
       " 'tokenized-4k/tokenized-15',\n",
       " 'tokenized-4k/tokenized-16',\n",
       " 'tokenized-4k/tokenized-17',\n",
       " 'tokenized-4k/tokenized-18',\n",
       " 'tokenized-4k/tokenized-19',\n",
       " 'tokenized-4k/tokenized-20',\n",
       " 'tokenized-4k/tokenized-21',\n",
       " 'tokenized-4k/tokenized-22',\n",
       " 'tokenized-4k/tokenized-23',\n",
       " 'tokenized-4k/tokenized-24',\n",
       " 'tokenized-4k/tokenized-25',\n",
       " 'tokenized-4k/tokenized-26',\n",
       " 'tokenized-4k/tokenized-27']"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "folders = sorted(glob('tokenized-4k/tokenized-*'), key = lambda x: int(x.split('-')[-1]))\n",
    "folders"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "85e34dd1",
   "metadata": {},
   "outputs": [],
   "source": [
    "!rm -rf packing-4k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "7ed8dea8",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 11324/11324 [00:01<00:00, 9107.35it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 12691/12691 [00:01<00:00, 9912.93it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 20838/20838 [00:02<00:00, 9725.90it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 14405/14405 [00:01<00:00, 11139.13it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 15445/15445 [00:01<00:00, 11597.55it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 17804/17804 [00:01<00:00, 13029.68it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 29525/29525 [00:02<00:00, 11724.07it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 19625/19625 [00:04<00:00, 4570.57it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 8145/8145 [00:02<00:00, 3416.60it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 7116/7116 [00:01<00:00, 4836.02it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 2197/2197 [00:00<00:00, 3322.09it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 2104/2104 [00:00<00:00, 2192.87it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 2348/2348 [00:00<00:00, 4952.74it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 9301/9301 [00:02<00:00, 4013.05it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 13440/13440 [00:02<00:00, 5380.47it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 13078/13078 [00:01<00:00, 10718.40it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 12694/12694 [00:00<00:00, 12919.71it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 17548/17548 [00:01<00:00, 11174.54it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 16987/16987 [00:01<00:00, 12001.95it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 14467/14467 [00:02<00:00, 6501.93it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 4425/4425 [00:00<00:00, 5877.15it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 22515/22515 [00:01<00:00, 12739.47it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 9349/9349 [00:01<00:00, 5150.98it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 16783/16783 [00:02<00:00, 5641.31it/s]\n",
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████| 34196/34196 [00:03<00:00, 10180.83it/s]\n",
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████| 16641/16641 [00:01<00:00, 8775.13it/s]\n",
      "100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 2955/2955 [00:00<00:00, 4365.29it/s]\n",
      "100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 2816/2816 [00:00<00:00, 15485.27it/s]\n"
     ]
    }
   ],
   "source": [
    "with MDSWriter(out='packing-4k', columns=columns, compression=None, hashes=hashes) as out:\n",
    "    for f in folders:\n",
    "        try:\n",
    "            dataset = LocalDataset(local=f)\n",
    "            for i in tqdm(range(len(dataset))):\n",
    "                out.write(dataset[i])\n",
    "        except Exception as e:\n",
    "            print(e)\n",
    "            pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c71cb7e9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.138980864"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset = LocalDataset('packing-4k')\n",
    "(len(dataset) * 3072) / 1e9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "ed1b8c00",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "' and 9\\n    AND f.n between 1 and 7\\n) primes\\nWHERE p2 + p3 + p5 + p7 + p11 = 100;\\n```\\n\\nPertanyaan di atas akan menghasilkan semua kombinasi nombor gandaan daripada 2, 3, 5, 7, 11, dan 13 yang nilainya kurang daripada atau sama dengan 100 (dengan mengehadkan nilai n pada setiap faktor perdana). Kemudian, pertanyaan akan memilih semua rangkaian gandaan nombor perdana yang jika ditambah akan menghasilkan 100.\\n\\nHarap dicatat bahawa pertanyaan ini berdasarkan jadual \"nombor\" yang harus ada dalam pangkalan data anda, dan jadual ini mesti mengandungi sekurang-kurangnya satu lajur \"n\" dengan nilai 1 hingga 100. Jika jadual ini belum wujud dalam pangkalan data anda, maka pertanyaan tidak akan berjalan betul dan perlu dibuat terlebih dahulu.<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 04 Jan 2025\\n\\n<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nterjemah ke bahasa melayu `Dalam database SQL, untuk merancang tabel untuk menyimpan sejarah dan perubahan yang dilakukan oleh penjelajah waktu, Anda dapat menggunakan pendekatan \"auditing\", yaitu membuat sebuah tabel yang merekam semua perubahan data dalam tabel utama. Tabel ini akan memiliki struktur dasar yang terdiri dari kolom-kolom seperti ID perubahan (change ID), waktu perubahan (change time), pengguna yang membuat perubahan (user ID), nama tabel utama yang terpengaruh (main table name), dan tindakan yang dilakukan pada data (action).\\n\\nSelain itu, Anda dapat memasukkan bidang-bidang tambahan ke dalam tabel untuk lebih detail dan transparansi, misalnya ID baris (row ID), kolom yang terpengaruh (affected column), nilai sebelum dan sesudah perubahan (before/after values), dan keterangan tambahan (notes).\\n\\nUntuk melacak efek riak dan perubahan yang dihasilkan pada sejarah, Anda dapat menambahkan bidang yang merekam informasi terkait, seperti ID perubahan induk (parent change ID) dan urutan (sequence).\\n\\nKetika merancang kueri untuk memungkinkan protagonis menjelajahi timeline dan mencari momen kunci yang perlu diperbaiki, Anda dapat menggunakan fitur SQL seperti subquery dan join, untuk menampilkan data historis dari tabel utama dan tabel yang merekam perubahan, diurutkan berdasarkan waktu dan dihubungkan dengan ID baris. Anda juga dapat menambahkan filter berdasarkan waktu, pengguna, dan nilai kolom tertentu untuk mempersempit hasil pencarian.\\n\\nUntuk menyoroti tema penebusan dan pengorbanan, Anda dapat menambahkan bidang untuk merekam keterangan perubahan, seperti \"alasan\" (reason), \"konsekuensi\" (consequences), dan \"nilai moral\" (moral value). Dengan memantau nilai moral ini, Anda dapat melacak pengorbanan yang dilakukan oleh protagonis untuk memperbaiki segala sesuatu. Contoh kueri yang dapat digunakan untuk ini adalah untuk menampilakan informasi perubahan yang bertujuan meningkatkan moral value pada kolom tertentu.\\n\\nDalam kesimpulannya, dalam database SQL untuk merancang tabel yang sesuai dengan menyimpan berbagai timeline dan perubahan yang dilakukan oleh penjelajah waktu, Anda membutuhkan pendekatan \"auditing\". Hal ini akan memampukan data riwayat dengan detail dan transparansi sebesar mungkin. Selain itu, memasukkan bidang-bidang yang merekam informasi terkait seperti ID perubahan induk, urutan serta keterangan perubahan yang selanjutnya memungkinkan pengguna dalam menjelajahi timeline dan mencari momen kunci yang perlu diperbaiki.`<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nDalam pangkalan data SQL, untuk mereka jadual untuk menyimpan sejarah dan perubahan yang dilakukan oleh penjelajah masa, anda boleh menggunakan pendekatan \"auditing\", iaitu membuat jadual yang merakam semua perubahan data dalam jadual utama. Jadual ini akan mempunyai struktur asas yang terdiri daripada lajur seperti ID perubahan (change ID), masa perubahan (change time), pengguna yang membuat perubahan (user ID), nama jadual utama yang terjejas (nama jadual utama) dan tindakan yang dibuat pada data (action).\\n\\nSelain itu, anda boleh memasukkan bidang tambahan ke dalam jadual untuk lebih terperinci dan ketelusan, contohnya ID baris (row ID), lajur yang terjejas (affected column), nilai sebelum dan selepas perubahan (before/after values), dan nota tambahan (notes).\\n\\nUntuk mengesan kesan riak dan perubahan yang dihasilkan pada sejarah, anda boleh menambah bidang yang merekodkan maklumat berkaitan, seperti ID perubahan induk (parent change ID) dan urutan (sequence).\\n\\nApabila merancang soalan untuk membolehkan protagonis menjelajahi garis masa dan mencari momen kunci yang perlu diperbaiki, anda boleh menggunakan ciri-ciri SQL seperti subquery dan join, untuk memaparkan data historis dari jadual utama dan jadual yang merekodkan perubahan, disusun mengikut waktu dan dihubungkan dengan ID baris. Anda juga boleh menambah penapis berdasarkan masa, pengguna dan nilai lajur tertentu untuk mempersempit hasil carian.\\n\\nUntuk menyerlahkan tema tebus dan pengorbanan, anda boleh menambah bidang untuk merekodkan keterangan perubahan, seperti \"reason\" (reason), \"consequences\" (consequences), dan \"moral value\" (moral value). Dengan memantau nilai moral ini, anda boleh menjejaki pengorbanan yang dilakukan oleh protagonis untuk memperbaiki sesuatu perkara. Contoh soalan yang boleh digunakan untuk ini adalah untuk memaparkan maklumat perubahan yang bertujuan untuk meningkatkan nilai moral pada lajur tertentu.\\n\\nKesimpulannya, dalam pangkalan data SQL untuk mereka jadual yang sesuai dengan menyimpan pelbagai garis masa dan perubahan yang dilakukan oleh penjelajah masa, anda memerlukan pendekatan \"auditing\". Ini akan menggabungkan data sejarah dengan detail dan ketelusan sebanyak mungkin. Selain itu, masukkan bidang yang merekodkan maklumat berkaitan seperti ID perubahan induk, urutan serta keterangan perubahan yang seterusnya membolehkan pengguna menjelajahi garis masa dan mencari momen kunci yang perlu diperbaiki.<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 04 Jan 2025\\n\\n<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nterjemah ke bahasa melayu `Ada beberapa metode tidak konvensional yang dapat digunakan perusahaan untuk menghemat uang dalam operasi sehari-hari mereka, di antaranya:\\n\\n1. Outsourcing dengan freelancer atau pekerja lepas: Daripada merekrut karyawan penuh waktu dan menanggung biaya overhead dan gaji yang terkait, perusahaan dapat mempertimbangkan untuk mengontrak freelancer atau pekerja lepas untuk menyelesaikan tugas tertentu. Ini dapat menjadi cara yang efektif untuk menghemat biaya, karena perusahaan hanya membayar untuk layanan yang dibutuhkan tanpa harus membayar tunjangan atau asuransi.\\n\\n2. Menggunakan energi terbarukan: Perusahaan dapat mempertimbangkan untuk menggunakan energi terbarukan seperti tenaga matahari atau angin untuk memenuhi kebutuhan energi mereka. Meskipun investasi awalnya mungkin mahal, penggunaan energi terbarukan dapat membantu perusahaan menghemat biaya dalam jangka panjang karena mereka tidak harus membayar tagihan utilitas yang tinggi dari sumber energi fosil.\\n\\n3. Memanfaatkan teknologi dan perangkat lunak: Perusahaan dapat menggunakan teknologi dan perangkat lunak untuk mengotomatisasi beberapa tugas operasional yang sebelumnya dilakukan secara manual. Ini akan membantu meningkatkan efisiensi dan produktivitas, menghemat waktu dan biaya. Selain itu, perusahaan dapat mempertimbangkan untuk menggunakan perangkat lunak open source yang gratis, daripada perangkat lunak berbayar, untuk mengotomatisasi operasi mereka. Ini dapat membantu menghemat biaya lisensi perangkat lunak dan biaya dukungan teknis.`<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nTerdapat beberapa kaedah tidak konvensional yang boleh digunakan oleh syarikat untuk menjimatkan wang dalam operasi harian mereka, antaranya:\\n\\n1. Pengambilan pekerja secara bebas: Daripada mengambil pekerja sepenuh masa dan menanggung kos overhed dan gaji yang berkaitan, syarikat boleh mempertimbangkan untuk mengupah pekerja bebas atau pekerja sambilan untuk menyelesaikan tugas tertentu. Ini boleh menjadi cara yang berkesan untuk menjimatkan perbelanjaan, kerana syarikat hanya membayar untuk perkhidmatan yang diperlukan tanpa perlu membayar faedah atau insurans.\\n\\n2. Menggunakan tenaga boleh diperbaharui: Syarikat boleh mempertimbangkan untuk menggunakan tenaga boleh diperbaharui seperti tenaga suria atau angin untuk memenuhi keperluan tenaga mereka. Walaupun pelaburan awal mungkin mahal, penggunaan tenaga boleh diperbaharui dapat membantu syarikat menjimatkan perbelanjaan dalam jangka panjang kerana mereka tidak perlu membayar bil utiliti tinggi daripada sumber tenaga fosil.\\n\\n3. Manfaatkan teknologi dan perisian: Syarikat boleh menggunakan teknologi dan perisian untuk mengautomatikkan beberapa tugasan operasi yang sebelumnya dilakukan secara manual. Ini akan membantu meningkatkan kecekapan dan produktiviti, menjimatkan masa dan kos. Selain itu, syarikat boleh mempertimbangkan untuk menggunakan perisian sumber terbuka percuma, berbanding perisian berbayar, untuk mengautomatisasi operasi mereka. Ini boleh membantu menjimatkan yuran lesen perisian dan yuran sokongan teknikal.<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 04 Jan 2025\\n\\n<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\n`Dalam satu dimensi, hubungan antara kecepatan, perpindahan, dan percepatan dapat direpresentasikan dalam persamaan berikut:\\n\\n$$v = v_0 + at$$\\n\\n$$s = s_0 + v_0t + \\\\frac{1}{2}at^2$$\\n\\n$$v^2 = v_0^2 + 2a(s - s_0)$$\\n\\nDi mana:\\n\\n$v$: kecepatan (m/s)\\n\\n$v_0$: kecepatan awal (m/s)\\n\\n$a$: percepatan (m/s²)\\n\\n$t$: waktu (s)\\n\\n$s$: perpindahan (m)\\n\\n$s_0$: posisi awal (m)` terjemah ke malay<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nDalam satu dimensi, hubungan antara halaju, pecutan dan pecutan boleh diwakili dalam persamaan berikut:\\n\\n$$v = v_0 + at$$\\n\\n$$s = s_0 + v_0t + \\\\frac{1}{2}at^2$$\\n\\n$$v^2 = v_0^2 + 2a(s - s_0)$$\\n\\nDi mana:\\n\\n$v$: halaju (m/s)\\n\\n$v_0$: halaju awal (m/s)\\n\\n$a$: pecutan (m/s²)\\n\\n$t$: masa (s)\\n\\n$s$: pecutan (m)\\n\\n$s_0$: kedudukan awal (m)<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 04 Jan 2025\\n\\n<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\n`Maaf, pertanyaan ini tidak dapat dijawab oleh AI karena tidak ada frasa yang diberikan sebagai contoh. Mohon berikan frasa yang ingin diidentifikasi, sehingga jawaban dapat diberikan dengan lebih tepat dan akurat. Terima kasih.` terjemah ke malay<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nMaaf, soalan ini tidak dapat dijawab oleh AI kerana tiada frasa diberikan sebagai contoh. Sila berikan frasa yang anda ingin kenal pasti supaya jawapan boleh diberikan dengan lebih tepat dan tepat. Terima kasih.<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 04 Jan 2025\\n\\n<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nteks: Berikut adalah kode Python untuk menemukan irisan dari dua list:\\n\\n```\\ndef find_intersection(list1, list2):\\n    intersection = []\\n    for item in list1:\\n        if item in list2:\\n            intersection.append(item)\\n    return intersection\\n    \\nlist1 = [1, 2,'"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.decode(dataset[-3]['input_ids'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "32d65447",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "' 3, 4]\\nlist2 = [3, 4, 5, 6]\\nresult = find_intersection(list1, list2)\\nprint(result)\\n```\\n\\nPada baris pertama, sebuah fungsi bernama `find_intersection` dengan dua parameter `list1` dan `list2` didefinisikan. \\n\\nPada baris kedua, sebuah variabel bernama `intersection` yang akan menyimpan hasil temuan irisan dari kedua list didefinisikan sebagai list kosong. \\n\\nPada baris ketiga, program melakukan perulangan untuk setiap item pada `list1`. \\n\\nPada baris keempat, program memeriksa apakah item yang sedang diperiksa juga ada pada `list2`. \\n\\nPada baris kelima, jika item ditemukan di kedua list, maka ia akan ditambahkan ke dalam variabel `intersection`.\\n\\nPada baris keenam, setelah semua perulangan selesai dilakukan, hasil irisan yang ditemukan akan dikembalikan oleh fungsi `find_intersection`.\\n\\nPada baris kedelapan dan kesembilan, `list1` dan `list2` didefinisikan sebagai list berisi angka-angka. \\n\\nPada baris kesepuluh, program memanggil fungsi `find_intersection` dengan mengirimkan kedua list sebagai parameter. \\n\\nPada baris kesebelas, hasil irisan yang ditemukan akan dicetak di layar.\\n\\nHasil keluaran dari program ini akan menjadi `[3, 4]` yang merupakan angka-angka yang terdapat pada kedua list `list1` dan `list2`. \\nterjemah ke melayu baku<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nBerikut adalah kod Python untuk mencari persimpangan dua senarai:\\n\\n```\\ndef cari_persimpangan(list1, list2):\\n    persimpangan = []\\n    for item in list1:\\n        if item in list2:\\n            persimpangan.append(item)\\n    return persimpangan\\n    \\nlist1 = [1, 2, 3, 4]\\nlist2 = [3, 4, 5, 6]\\nresult = cari_persimpangan(list1, list2)\\nprint(result)\\n```\\n\\nPada baris pertama, fungsi bernama `find_intersection` dengan dua parameter `list1` dan `list2` ditakrifkan. \\n\\nPada baris kedua, pembolehubah bernama `intersection` yang akan menyimpan hasil penemuan persimpangan dari kedua-dua senarai didefinisikan sebagai senarai kosong. \\n\\nPada baris ketiga, program melakukan pengulangan untuk setiap item pada `list1`. \\n\\nPada baris keempat, program memeriksa sama ada item yang sedang diperiksa juga wujud dalam `list2`. \\n\\nPada baris kelima, jika item ditemui di kedua-dua senarai, maka ia akan ditambahkan ke dalam pembolehubah `intersection`. \\n\\nPada baris keenam, setelah semua pengulangan selesai dilakukan, hasil persimpangan yang dijumpai dikembalikan oleh fungsi `find_intersection`. \\n\\nPada baris kedelapan dan kesembilan, `list1` dan `list2` ditakrifkan sebagai senarai yang mengandungi nombor. \\n\\nPada baris kesepuluh, program memanggil fungsi `find_intersection` dengan menghantar kedua-dua senarai sebagai parameter. \\n\\nPada baris kesebelas, hasil persimpangan yang dijumpai akan dicetak pada skrin. \\n\\nHasil keluaran daripada program ini akan menjadi `[3, 4]` iaitu nombor yang terdapat pada kedua-dua senarai `list1` dan `list2`.<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 04 Jan 2025\\n\\n<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nteks: Berikut ini adalah kode Python dengan perbaikan serta penjelasan mengenai perubahan yang dilakukan:\\n\\n```python\\nsiswa = {\\n  \"John\": {\"usia\": 15, \"nilai\": 80},\\n  \"Emily\": {\"usia\": 16, \"nilai\": 90},\\n  \"Sarah\": {\"usia\": 15, \"nilai\": 85}\\n}\\n\\ndef sum_dict_values(d):\\n  total = 0\\n  for v in d.values():\\n    total += v[\"nilai\"]\\n  return total\\n\\nprint(sum_dict_values(siswa))\\n```\\n\\n- Pada kode awal, tidak ditemukan permasalahan yang signifikan. \\n\\n- Kode sudah mencakup seluruh informasi tentang ketiga siswa dalam sebuah kamus. \\n\\n- Terdapat fungsi `sum_dict_values(d)` yang menerima parameter berupa kamus (dictionary) `d` dan akan menghitung total nilai dari semua nilai di dalam kamus.\\n\\n- Pada blok `for`, nilai-nilai diakses menggunakan `v` dan dijumlahkan satu per satu pada variabel `total`.\\n\\n- Terakhir, hasil total dihasilkan dan dikembalikan oleh fungsi `sum_dict_values(d)`.\\n\\nPada saat kode dijalankan dapat terjadi kesalahan, seperti:\\n\\n- Tidak menimpa atau mengganti variabel tuple saja.\\n\\n- Cek kembali penulisan menandaskan atau tidak tanda petiknya.\\n\\n- Cek kembali penulisan titik dua (:) pada kode.\\n\\n- Cek kembali tabel \"siswa\" apakah bersih atau tidak terdefinisi.\\n\\n- Cek kembali apakah inisialisasi variabel dalam fungsi sesuai. \\n\\n- Selain itu, juga perlu mengonfirmasi bahwa program berjalan tanpa kesalahan dan menghasilkan output yang diinginkan ketika didorong ke Python रचनाएँ interpreter.\\n\\nUntuk perbaikannya:\\n\\n```python\\nsiswa = {\\n  \"John\": {\"usia\": 15, \"nilai\": 80},\\n  \"Emily\": {\"usia\": 16, \"nilai\": 90},\\n  \"Sarah\": {\"usia\": 15, \"nilai\": 85}\\n}\\n\\ndef sum_dict_values(d):\\n  total = 0\\n  for v in d.values():\\n    total += v[\"nilai\"]\\n  return total\\n\\nprint(sum_dict_values(siswa))\\n```\\n\\nSetelah melakukan perbaikan, kode dapat dijalankan dengan benar dan akan mencetak hasil penjumlahan dari semua nilai di dalam kamus, sesuai dengan yang diinginkan.\\nterjemah ke melayu baku<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nBerikut adalah kod Python dengan penambahbaikan dan penjelasan mengenai perubahan yang dilakukan:\\n\\n```python\\nsiswa = {\\n  \"John\": {\"umur\": 15, \"nilai\": 80},\\n  \"Emily\": {\"umur\": 16, \"nilai\": 90},\\n  \"Sarah\": {\"umur\": 15, \"nilai\": 85}\\n}\\n\\ndef sum_dict_values(d):\\n  total = 0\\n  for v in d.values():\\n    total += v[\"nilai\"]\\n  return total\\n\\nprint(sum_dict_values(siswa))\\n```\\n\\n- Pada kod awal, tidak terdapat masalah yang ketara. \\n\\n- Kod sudah merangkumi semua maklumat tentang ketiga-tiga siswa dalam kamus. \\n\\n- Terdapat fungsi `sum_dict_values(d)` yang menerima parameter berupa kamus (dictionary) `d` dan akan mengira jumlah nilai dari semua nilai di dalam kamus. \\n\\n- Pada blok `for`, nilai diakses menggunakan `v` dan ditambahkan satu per satu pada pembolehubah `total`. \\n\\n- Akhirnya, hasil jumlah dihasilkan dan dikembalikan oleh fungsi `sum_dict_values(d)`. \\n\\nPada saat kod dijalankan, boleh berlaku ralat, seperti: \\n\\n- Tidak menimpa atau menggantikan pemboleh ubah tuple sahaja. \\n\\n- Cek semula penulisan berdasarkan tanda petiknya atau tidak. \\n\\n- Cek semula penulisan titik dua (:) pada kod. \\n\\n- Cek semula sama ada jadual \"siswa\" bersih atau tidak ditakrifkan. \\n\\n- Cek semula apakah penginisialisasi pembolehubah dalam fungsi sesuai. \\n\\n- Selain itu, perlu mengesahkan bahawa program berjalan tanpa ralat dan menghasilkan output yang diinginkan apabila dipacu ke penterjemah Python रचनाएँ. \\n\\nUntuk memperbaiki:\\n\\n```python\\nsiswa = {\\n  \"John\": {\"umur\": 15, \"nilai\": 80},\\n  \"Emily\": {\"umur\": 16, \"nilai\": 90},\\n  \"Sarah\": {\"umur\": 15, \"nilai\": 85}\\n}\\n\\ndef sum_dict_values(d):\\n  total = 0\\n  for v in d.values():\\n    total += v[\"nilai\"]\\n  return total\\n\\nprint(sum_dict_values(siswa))\\n```\\n\\nSetelah melakukan pembaikan, kod dapat dijalankan dengan betul dan akan mencetak hasil penambahan semua nilai di dalam kamus, mengikut yang diinginkan.<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 04 Jan 2025\\n\\n<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\n`Huruf ke-10 dalam alfabet adalah huruf \"J\" dalam Kode Morse. Dalam Kode Morse, setiap huruf direpresentasikan dengan serangkaian titik dan garis. Huruf \"J\" direpresentasikan dengan satu titik, diikuti oleh tiga garis, yang ditransmisikan sebagai \"dot dash dash dash\" atau \".---\" dalam notasi Kode Morse. \\n\\nUntuk lebih memahami Kode Morse, disarankan untuk belajar mengenali setiap karakter dan polanya, serta cara mengucapkan dan mendengarkan kode tersebut. Ini dapat dilakukan dengan membaca buku atau tutorial online, atau bahkan dengan berlatih menggunakan alat Kode Morse, seperti keyer atau program komputer. Dengan berlatih secara teratur, seseorang dapat menjadi ahli dalam Kode Morse dan menggunakannya untuk berkomunikasi dengan orang lain dalam situasi yang tepat, seperti dalam situasi darurat atau selama aktivitas radio.` terjemah ke malay<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nHuruf ke-10 dalam abjad ialah huruf \"J\" dalam Kod Morse. Dalam Kod Morse, setiap huruf diwakili dengan siri titik dan garis. Huruf \"J\" diwakili oleh satu titik, diikuti oleh tiga garisan, yang ditransmisikan sebagai \"dot dash dash dash\" atau \".---\" dalam tatatanda Kod Morse.\\n\\nUntuk lebih memahami Kod Morse, adalah disyorkan untuk belajar mengenali setiap aksara dan corak mereka, serta cara mengucapkan dan mendengar kod tersebut. Ini boleh dilakukan dengan membaca buku atau tutorial dalam talian, atau pun dengan berlatih menggunakan alat Kod Morse, seperti kunci atau aturcara komputer. Dengan berlatih secara teratur, seseorang boleh menjadi pakar dalam Kod Morse dan menggunakannya untuk berkomunikasi dengan orang lain dalam situasi yang betul, seperti dalam keadaan kecemasan atau semasa aktiviti radio.<|eot_id|><|begin_of_text|><|start_header_id|>system<|end_header_id|>\\n\\nCutting Knowledge Date: December 2023\\nToday Date: 04 Jan 2025\\n\\n<|eot_id|><|start_header_id|>user<|end_header_id|>\\n\\nterjemah ke bahasa melayu `MRI atau Magnetic Resonance Imaging adalah teknik pencitraan medis yang memanfaatkan magnet kuat dan gelombang radio untuk menghasilkan gambaran detail struktur tubuh internal. Metode ini memiliki kemampuan untuk membuat gambar tiga dimensi dengan detail yang lebih akurat dan lebih tajam dari teknik pencitraan medis lainnya seperti x-ray dan CT Scan.\\n\\nPada dasarnya, MRI menggunakan satuan magnetik bernama tesla untuk membentuk gambaran. Alat MRI berisi magnet superkonduktor yang menghasilkan medan magnet kuat yang melalui tubuh pasien. Keberadaan medan magnet ini akan menyebabkan medan magnetik pada proton-proton di dalam tubuh yang mendukung pembentukan gambar. Ketika pasien berada di dalam ruang magnetik, gelombang radio dengan frekuensi tertentu ditembakkan ke tubuh, melalui sebuah koil, yang kemudian akan merangsang proton-proton tersebut sehingga terbentuk sinyal. Informasi ini kemudian diolah oleh komputer yang menghasilkan gambar tubuh pasien.\\n\\nMRI dapat menghasilkan gambar dengan resolusi lebih tinggi dari teknik pencitraan medis lainnya. Hal ini karena gambar yang dihasilkan sangat detail, dapat menunjukkan detail jaringan otot, tulang, organ, dan cairan dalam tubuh. Selain itu, teknik MRI juga bisa digunakan untuk memperoleh informasi tentang fungsi otak, organ dalam, dan jaringan lunak lainnya.\\n\\nNamun, meskipun teknik MRI sangat berguna dalam diagnosis penyakit, perlu diingat bahwa tidak semua orang dapat menjalani prosedur MRI. Pasien dengan pacemaker, logam di dalam tubuh atau alergi kontras, biasanya tidak diperbolehkan untuk menjalani pemeriksaan MRI.\\n\\nMeskipun demikian, MRI tetap menjadi salah satu teknologi pencitraan medis yang paling berguna dan canggih dalam dunia medis saat ini.`<|eot_id|><|start_header_id|>assistant<|end_header_id|>\\n\\nMRI atau Pengimejan Resonans Magnetik adalah teknik pengimejan perubatan yang memanfaatkan magnet kuat dan gelombang radio untuk menghasilkan gambaran terperinci struktur badan dalaman. Kaedah ini mempuny'"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer.decode(dataset[-2]['input_ids'])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python3.10",
   "language": "python",
   "name": "python3.10"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
